1039. Course List for Student

Direct Link

/*
HBQ 大神的代码
总结:思路不开阔,对程序运行的过程分析不透彻。
题目就是卡数据,但是自己太鹺。
*/
#include <stdio.h>
#include <map>
#include <set>
#include <string.h>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

bool get(int& a)
{
  if( scanf("%d",&a) == EOF ) return false ;
  return true ;
}

const int maxn = 2500*200 ;
int nimei[maxn] , cnt ;
int id[26][26][26][10] ;

int bs(int key,int l,int r)
{
  int mid ;
  while ( l <= r )
  {
    mid = ( l + r ) >> 1 ;
    if( nimei[mid] > key )
      r = mid - 1 ;
    else
      l = mid + 1 ;
  }
  return r ;
}

int main()
{
  int n , m ;
  get(n); get(m);
  int i , j , k ;
  int idCnt = 1 ;
  cnt = 0 ;
  for ( i = 0 ; i < m ; i++)
  {
    get(j); get(k);
    char str[16] ;
    while(k--)
    {
      scanf("%s",str);
      int &temp = id[str[0]-'A'][str[1]-'A'][str[2]-'A'][str[3]^48] ;
      if( temp == 0 )
        temp = idCnt++;
      nimei[cnt++] = temp*2500+j ;
    }
  }
  sort(nimei,nimei+cnt);
  char name[16] ;
  while(n--)
  {
    scanf("%s",name);
    int t = id[name[0]-'A'][name[1]-'A'][name[2]-'A'][name[3]^48] ;
    if( t == 0 )
    {
      printf("%s 0\n",name);
      continue;
    }
    j = bs(t*2500,0,cnt-1) ;
    k = bs((t+1)*2500,j,cnt-1);
    printf("%s %d",name,k-j);
    for ( j++; j <= k ; j++)
    {
      printf(" %d",nimei[j]-t*2500);
    }
    puts("");
  }
  return 0;
}